Modern processors may include micro-architectural structures and techniques to improve processing performance and/or make use of specialized instructions. These micro-architectural structures and techniques may include, for example, out-of-order execution, decoders for fusing macro-instructions into a fused instruction, micro-instruction or micro-operation (or micro-op, “uop”) cache, or trace cache, or queue for processing compressed and/or fused instructions or micro-ops.
Instruction fusion is a dynamic process that combines two instructions into a single instruction which results in a one operation, micro-operation, sequence within a processor at runtime. Instructions stored in a processor instruction queue (IQ) may be “fused” after being read out of the IQ and before being sent to instruction decoders or after being decoded by the instruction decoders. Typically, instruction fusion occurring before the instruction is decoded is referred to as “macro-fusion”, whereas instruction fusion occurring after the instruction is decoded (into uops, for example) is referred to as “micro-fusion”. An example of macro-fusion is the combining of a compare (“CMP”) instruction or test instruction (“TEST”) (“CMP/TEST”) with a conditional jump (“JCC”) instruction. CMP/TEST and JCC instruction pairs may occur regularly in programs at the end of loops, for example, where a comparison is made and, based on the outcome of a comparison, a branch is taken or not taken. Since macro-fusion may effectively increase instruction throughput, it may be desirable to find as many opportunities to fuse instructions as possible.
Web browsers may include support for one or more interpreted computer programming language so that client-side scripts may interact with a user, control the browser, communicate asynchronously and alter document content as it is displayed, etc. An interpreted computer programming or scripting language, for example such as JavaScript, JScript or ECMAScript, may be dynamic and weakly typed and may support object-oriented, imperative and functional programming styles. Such interpreted computer programming languages may find browser support in the form of a just-in-time (JIT) compiler, which dynamically compiles the interpreted language into machine instruction sequences. JIT compilers may optimize stored values for faster processing, but then need to dynamically test the types of objects for such optimizations during runtime. These dynamic tests can introduce additional processing overhead requiring higher energy consumption and also limiting any performance advantages of such optimizations.
To date, potential solutions to such performance limiting issues, energy consumption worries, and other runtime bottlenecks have not been adequately explored.